package com.jianyi.util;

import java.io.File;
import java.util.Properties;

import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.mail.BodyPart;
import javax.mail.Message;
import javax.mail.Multipart;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;

import com.jfinal.kit.PropKit;

public class SendMailUtil {

    
    /**
    * @Method: createSimpleMail
    * @Description: 创建一封只包含文本的邮件
    * @Anthor:孤傲苍狼
    *
    * @param session
    * @return
    * @throws Exception
    */ 
    public static MimeMessage createSimpleMail(Session session,String subject,String sendHtml,String receiveUser)
            throws Exception {
        //创建邮件对象
        MimeMessage message = new MimeMessage(session);
        //指明邮件的发件人
        message.setFrom(new InternetAddress("gacl@sohu.com"));
        //指明邮件的收件人，现在发件人和收件人是一样的，那就是自己给自己发
        message.setRecipient(Message.RecipientType.TO, new InternetAddress("gacl@sohu.com"));
        //邮件的标题
        message.setSubject(subject);
        //邮件的文本内容
        message.setContent(sendHtml, "text/html;charset=UTF-8");
        //返回创建好的邮件对象
        return message;
    }
    
    /**
     * @Method: createSimpleMail
     * @Description: 创建一封只包含文本的邮件
     * @Anthor:孤傲苍狼
     *
     * @param session
     * @return
     * @throws Exception
     */ 
     public static MimeMessage createFileMail(Session session,String subject,String sendHtml,String receiveUser,File attachment)
             throws Exception {
         //创建邮件对象
         MimeMessage message = new MimeMessage(session);
         //指明邮件的发件人
         message.setFrom(new InternetAddress("gacl@sohu.com"));
         //指明邮件的收件人，现在发件人和收件人是一样的，那就是自己给自己发
         message.setRecipient(Message.RecipientType.TO, new InternetAddress("gacl@sohu.com"));
         //邮件的标题
         message.setSubject(subject);
         //邮件的文本内容
         message.setContent(sendHtml, "text/html;charset=UTF-8");
         //返回创建好的邮件对象
         return message;
     }
    
    /**
     * 发送邮件
     * 
     * @param subject
     *            邮件主题
     * @param sendHtml
     *            邮件内容
     * @param receiveUser
     *            收件人地址
     * @param attachment
     *            附件
     */
    public static void doSendSimpleEmail(String subject, String sendHtml, String receiveUser) {
         
    	Properties prop = new Properties();
        prop.setProperty("mail.host", PropKit.get("mail.smtp.host"));
        prop.setProperty("mail.transport.protocol", "smtp");
        prop.setProperty("mail.smtp.auth", "true");
    	
		try {
			
			//使用JavaMail发送邮件的5个步骤
	         //1、创建session
	         Session session = Session.getInstance(prop);
	         //开启Session的debug模式，这样就可以查看到程序发送Email的运行状态
	         session.setDebug(true);
	         //2、通过session得到transport对象
	         Transport ts;
			
	         ts = session.getTransport();
	         
	         //3、使用邮箱的用户名和密码连上邮件服务器，发送邮件时，发件人需要提交邮箱的用户名和密码给smtp服务器，用户名和密码都通过验证之后才能够正常发送邮件给收件人。
	         ts.connect(PropKit.get("mail.smtp.host"), PropKit.get("mail.user"), PropKit.get("mail.password"));
	         //4、创建邮件
	         Message message = createSimpleMail(session,subject,sendHtml,receiveUser);
	         //5、发送邮件
	         ts.sendMessage(message, message.getAllRecipients());
	         ts.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
    }
    
    /**
     * 发送邮件
     * 
     * @param subject
     *            邮件主题
     * @param sendHtml
     *            邮件内容
     * @param receiveUser
     *            收件人地址
     * @param attachment
     *            附件
     */
    public static void doSendFileEmail(String subject, String sendHtml, String receiveUser, File attachment) {
         
    	Properties prop = new Properties();
        prop.setProperty("mail.host", PropKit.get("mail.smtp.host"));
        prop.setProperty("mail.transport.protocol", "smtp");
        prop.setProperty("mail.smtp.auth", "true");
    	
		try {
			
			//使用JavaMail发送邮件的5个步骤
	         //1、创建session
	         Session session = Session.getInstance(prop);
	         //开启Session的debug模式，这样就可以查看到程序发送Email的运行状态
	         session.setDebug(true);
	         //2、通过session得到transport对象
	         Transport ts;
			
	         ts = session.getTransport();
	         
	         //3、使用邮箱的用户名和密码连上邮件服务器，发送邮件时，发件人需要提交邮箱的用户名和密码给smtp服务器，用户名和密码都通过验证之后才能够正常发送邮件给收件人。
	         ts.connect(PropKit.get("mail.smtp.host"), PropKit.get("mail.user"), PropKit.get("mail.password"));
	         
	         //用session为参数定义消息对象
	         MimeMessage message = new MimeMessage(session);
	         try{
	          //加载发件人地址
	             message.setFrom(new InternetAddress(PropKit.get("mail.user")));
	            //加载收件人地址
	             message.addRecipient(Message.RecipientType.TO,new InternetAddress(receiveUser));
	            //加载标题
	             message.setSubject(subject);
	           
	             // 向multipart对象中添加邮件的各个部分内容，包括文本内容和附件
	             Multipart multipart = new MimeMultipart();         
	           
	           
	             //   设置邮件的文本内容
	             BodyPart contentPart = new MimeBodyPart();
	             contentPart.setContent(sendHtml, "text/html;charset=UTF-8");
	             multipart.addBodyPart(contentPart);
	             //添加附件
	             BodyPart messageBodyPart= new MimeBodyPart();
	             // 得到数据源  
	             FileDataSource fds = new FileDataSource(attachment);  
	             //添加附件的内容
	             messageBodyPart.setDataHandler(new DataHandler(fds));
	             //添加附件的标题
	             //这里很重要，通过下面的Base64编码的转换可以保证你的中文附件标题名在发送时不会变成乱码
	             sun.misc.BASE64Encoder enc = new sun.misc.BASE64Encoder();
	             messageBodyPart.setFileName("=?GBK?B?"+enc.encode(fds.getName().getBytes())+"?=");
	             multipart.addBodyPart(messageBodyPart);
	           
	           
	             //将multipart对象放到message中
	             message.setContent(multipart);
	             //保存邮件
	             message.saveChanges();
	             
	             //5、发送邮件
		         ts.sendMessage(message, message.getAllRecipients());
		         ts.close();
	         }catch(Exception e){
	             e.printStackTrace();
	         }
	         
	        
		} catch (Exception e) {
			e.printStackTrace();
		}
    }
	
}
